package com.locus.locus.server.dados;

import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.locus.locus.client.dados.ConfiguracaoBoxWrapper;
import com.locus.locus.client.dados.EstabelecimentoWrapper;

@PersistenceCapable
public class ConfiguracaoBox implements Wrappable<ConfiguracaoBoxWrapper> {
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Key key;
	
	@Persistent
	private String nomeBox;
	@Persistent
	private List<Key> chavesEstabelecimentos;
	
	private transient List<Estabelecimento> estabelecimentos;
	
	public ConfiguracaoBox() {	}
	
	public ConfiguracaoBox(Key key, String nomeBox, List<Estabelecimento> estabelecimentos) {
		Key chave;
		
		this.key = key;
		this.nomeBox = nomeBox;
		this.estabelecimentos = estabelecimentos;
		this.chavesEstabelecimentos = new ArrayList<Key>();
		for(Estabelecimento e:estabelecimentos){
			chave = e.getKey();
			if(chave != null){
				this.chavesEstabelecimentos.add(chave);
			}
		}
	}

	public ConfiguracaoBox(ConfiguracaoBoxWrapper wrapper) {
		final String chave = wrapper.getChave();
		final List<EstabelecimentoWrapper> estabelecimentos = wrapper.getEstabelecimentos();
		String chaveEstabelecimento;
		
		if(chave != null){
			this.key = KeyFactory.stringToKey(chave);
		}
		
		this.nomeBox = wrapper.getNomeBox();
		this.estabelecimentos = new ArrayList<Estabelecimento>();
		this.chavesEstabelecimentos = new ArrayList<Key>();
		
		if(estabelecimentos != null){
			for(EstabelecimentoWrapper estabelecimento:estabelecimentos){
				this.estabelecimentos.add(new Estabelecimento(estabelecimento));
				chaveEstabelecimento = estabelecimento.getChave();
				if(chaveEstabelecimento != null){
					this.chavesEstabelecimentos.add(KeyFactory.stringToKey(chaveEstabelecimento));
				}
			}
		}
	}

	public Key getKey() {
		return key;
	}
	public void setKey(Key key) {
		this.key = key;
	}
	public String getNomeBox() {
		return nomeBox;
	}
	public void setNomeBox(String nomeBox) {
		this.nomeBox = nomeBox;
	}
	public List<Key> getChavesEstabelecimentos() {
		return chavesEstabelecimentos;
	}
	public void setChavesEstabelecimentos(List<Key> chavesEstabelecimentos) {
		this.chavesEstabelecimentos = chavesEstabelecimentos;
	}
	public List<Estabelecimento> getEstabelecimentos() {
		return estabelecimentos;
	}
	public void setEstabelecimentos(List<Estabelecimento> estabelecimentos) {
		this.estabelecimentos = estabelecimentos;
	}
	
	@Override
	public ConfiguracaoBoxWrapper gerarWrapper() {
		final ConfiguracaoBoxWrapper wrapper = new ConfiguracaoBoxWrapper();
		final List<EstabelecimentoWrapper> estabelecimentos;
		
		wrapper.setNomeBox(this.nomeBox);
		
		if(this.key != null){
			wrapper.setChave(KeyFactory.keyToString(this.key));
		}
		
		if(this.estabelecimentos == null){
			estabelecimentos = new ArrayList<EstabelecimentoWrapper>(0);
		}else{
			estabelecimentos = new ArrayList<EstabelecimentoWrapper>(this.estabelecimentos.size());
			for(Estabelecimento estabelecimento:this.estabelecimentos){
				estabelecimentos.add(estabelecimento.gerarWrapper());
			}
		}
		wrapper.setEstabelecimentos(estabelecimentos);
		
		return wrapper;
	}

	@Override
	public void deserializarRelacionamentos(PersistenceManager pm) {
		if(!this.chavesEstabelecimentos.isEmpty()){
			final Query query = pm.newQuery(Estabelecimento.class, ":p.contains(key)");
			final List<Estabelecimento> lista = (List<Estabelecimento>) query.execute(this.chavesEstabelecimentos);
			for(Estabelecimento estabelecimento:lista){
				estabelecimento.deserializarRelacionamentos(pm);
			}
			
			this.estabelecimentos = new ArrayList<Estabelecimento>(lista);
		}
	}
	
	@Override
	public boolean equals(Object outro) {
		return this.key.equals(((ConfiguracaoBox)outro).key);
	}
}
